// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.Collections;
// import java.util.List;
#pragma once
#include <list>
#include "../SQLExprImpl.h"
#include "../SQLReplaceable.h"

class SQLExpr;
class SQLIntervalUnit;
class SQLDataType;
class SQLASTVisitor;

class SQLExtractExpr :public SQLExprImpl ,virtual public SQLReplaceable {
  public:
    SQLExpr_ptr value;
    std::shared_ptr<SQLIntervalUnit> unit_;

    SQLExtractExpr() ;
  SHAREDOBJECT(SQLExtractExpr);

    virtual SQLObject_ptr clone() ;

    SQLExpr_ptr getValue() ;

    void setValue(SQLExpr_ptr value) ;

    std::shared_ptr<SQLIntervalUnit> getUnit() ;

    void setUnit(std::shared_ptr<SQLIntervalUnit> unit_) ;

    void accept0(SQLASTVisitor_ptr visitor) ;

    //@Override
    BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target) ;

    //@Override
    SQLObject_list_ptr  getChildren() ;

    //@Override
    int hashCode() ;

    //@Override
    bool equals(Object_ptr obj) ;

    SQLDataType_ptr computeDataType() ;
};
